package com.atguigu.srb.service.impl;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.RandomUtil;
import com.atguigu.srb.base.exception.SrbException;
import com.atguigu.srb.common.cons.RedisConst;
import com.atguigu.srb.common.result.ResultCodeEnum;
import com.atguigu.srb.service.SmsService;
import com.atguigu.srb.utils.HttpUtils;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class SmsServiceImpl implements SmsService {
    @Autowired
    StringRedisTemplate stringRedisTemplate;//一般操作字符串类型 或者 数值行 使用它
    @Override
    public void sendMessage(String mobile) {
        //TODO 1、判断手机号发送短信的频次   等短信发送成功设置了发送频率后 再处理
        //  一天不能超过5条： 防止盗刷短信
        //  两分钟内不能重复发送： 防止表单重复提交
        //2、给手机号发送短信
        // 生成验证码： 一般都是数字
        String code = RandomUtil.randomNumbers(4);
        // 发送短信
        boolean flag = sendCodeMessage(mobile,code);//调用发短信的方法 传入手机号和验证码
        if(!flag){
            //发送短信失败
            throw new SrbException(ResultCodeEnum.FAIL);
        }
        // 保存验证码到redis中缓存
        // 存储验证码的键： 一般使用特定的前缀字符串 和  手机号拼接(srb:code:13511111111)
        //   手机号需要存储获取验证码的次数、 还需要存储验证码字符串
        stringRedisTemplate.opsForValue().set(RedisConst.SMS_CODE_PREFIX+mobile
                ,code , 10 , TimeUnit.MINUTES); //保存验证码 设置10分钟的有效时间
        // 更新redis中验证码发送的频次(以后还可以查到短信发送频率的数据)
//        一天不能超过5条   如果键不存在，默认基于0+1(第一次自增返回1) ，      如果键已存在 使用它之前的值+1
        String countKey =RedisConst.SMS_COUNT_PREFIX+ mobile;
        Long result = stringRedisTemplate.opsForValue().increment(countKey);
        if(result.longValue() == 1){
            //当前手机号今天第一次获取验证码成功(设置统计次数的过期时间)
            stringRedisTemplate.expire(countKey , 1 , TimeUnit.DAYS);//设置统计次数的数据 过期时间为1天

        }
//        else{
//            //当前手机号今天多次获取验证码
//        }


    }

    private boolean sendCodeMessage(String mobile,String code){
        String host = "https://kzsms.market.alicloudapi.com";
        String path = "/api/sms/send";
        String method = "POST";
        String appcode = "8e45699f00ff4bdbb807664045acd813";
        //准备发送请求报文的 请求头
        Map<String, String> headers = new HashMap<String, String>();
        //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
        headers.put("Authorization", "APPCODE " + appcode);
        //根据API的要求，定义相对应的Content-Type
        headers.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        Map<String, String> querys = new HashMap<String, String>();

        //准备请求报文的请求体内容
        Map<String, String> bodys = new HashMap<String, String>();
        //需要给哪个手机号发送 哪个模板对应的短信内容
        bodys.put("templateId", "KZvoQcsO1HS23nYL8");//需要到
        bodys.put("mobile", mobile);
        //  您购买的sss 现已发货,xxx
        bodys.put("value", code);

        try {
            /**
             * 重要提示如下:
             * HttpUtils请从
             * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
             * 下载
             *
             * 相应的依赖请参照
             * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
             */
            //发送网络请求给host地址
            HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
            //发送短信的响应结果
//            System.out.println(response.toString());
            //获取response的body
            System.out.println(EntityUtils.toString(response.getEntity()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }


}
